package com.grupobbva.seguridad.web.servlet.action;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.grupobbva.seguridad.domain.Aplicacion;
import com.grupobbva.seguridad.domain.Perfil;
import com.grupobbva.seguridad.domain.TablaDetalle;
import com.grupobbva.seguridad.domain.Usuario;
import com.grupobbva.seguridad.service.AdministracionService;
import com.grupobbva.seguridad.service.SeguridadService;
import com.grupobbva.seguridad.util.Constante;
import com.grupobbva.seguridad.util.ResultadoOperacion;
import com.grupobbva.seguridad.util.ResultadoOperacionExito;
import com.grupobbva.seguridad.util.Util;

@Controller
public class MantenimientoAplicacionController extends BaseController {
	
	@Autowired
	private SeguridadService seguridadService;

	@Autowired
	private AdministracionService administracionService;

	@RequestMapping("/aplmnt.do")
    public String mostrar(HttpServletRequest request) throws Exception {
		request.setAttribute("estados", administracionService.obtenerDetalles(Constante.TG_ESTADOS_REGISTRO));
    	return getRelativeURL("aplmnt");
    }
	
	@RequestMapping("/apllst.do")
    public String listar(HttpServletRequest request) throws Exception {
		Aplicacion aplicacion = new Aplicacion();
		aplicacion.setAplicacionId(getParameterLong(request, "filtroCodigo"));
		aplicacion.setNombreCorto(getParameterString(request, "filtroNombreCorto"));
		aplicacion.setNombreLargo(getParameterString(request, "filtroNombreLargo"));
		aplicacion.setEstado(new TablaDetalle(getParameterLong(request, "filtroEstadoId")));
		
		request.setAttribute("aplicaciones", seguridadService.obtenerAplicaciones(aplicacion, getAccesoAplicacionIds(request)));
		
    	return getRelativeURL("apllst");
    }
	
	@RequestMapping("/aplupd.do")
    public String modificar(HttpServletRequest request) throws Exception {
		Aplicacion aplicacion = null;
		if(getParameterLong(request, "aplicacionId") == null) {
			aplicacion = new Aplicacion();
			aplicacion.setTipo(new TablaDetalle());
			aplicacion.setEstado(new TablaDetalle());
		} else {
			aplicacion = seguridadService.obtenerAplicacion(getParameterLong(request, "aplicacionId"));
		}
		request.setAttribute("aplicacion", aplicacion);
		request.setAttribute("tipos",    administracionService.obtenerDetalles(Constante.TG_TIPOS_APLICACION));
		request.setAttribute("estados",  administracionService.obtenerDetalles(Constante.TG_ESTADOS_REGISTRO));
    	return getRelativeURL("aplreg");
    }
	
	@RequestMapping("/apldel.do")
    public String eliminar(HttpServletRequest request) throws Exception {
    	ResultadoOperacion resultado = null;
		try {
			String codigoMensaje  = "aplicacion.eliminar.exito";
						
			seguridadService.eliminarAplicacion(new Aplicacion(getParameterLong(request, "aplicacionId")));
			
			resultado = new ResultadoOperacionExito(Util.getMessage(codigoMensaje));
		} catch (Exception e) {
			resultado = guardarMensajeError(request, e);
		}
    	return getRelativeAjaxURL(request, resultado);
    }
	
	@RequestMapping("/aplreg.do")
    public String grabar(@ModelAttribute("aplicacion") Aplicacion aplicacion, HttpServletRequest request) throws Exception {
        ResultadoOperacion resultado = null;
		try {
			String codigoMensaje  = "aplicacion."+((aplicacion.getAplicacionId()==null)?"registrar":"modificar")+".exito";
						
			seguridadService.registrarAplicacion(aplicacion, getUsuario(request));

        	Usuario usuario = getUsuario(request);
        	usuario.getAplicacionIds().add(aplicacion.getAplicacionId());
        	setUsuario(request, usuario);
			
			resultado = new ResultadoOperacionExito(Util.getMessage(codigoMensaje));
		} catch (Exception e) {
			resultado = guardarMensajeError(request, e);
		}
    	return getRelativeAjaxURL(request, resultado);
    }
	
	@RequestMapping("/aplscr.do")
    public String generarScript(HttpServletRequest request) throws Exception {
		ResultadoOperacion resultado = null;
		try {
			Long tipoGeneracionId      = getParameterLong(request, "tipoGeneracionId");
			Long aplicacionId          = getParameterLong(request, "aplicacionId");
			Long aplicacionIdReemplazo = getParameterLong(request, "aplicacionIdReemplazo");
			
			if (tipoGeneracionId == null) {
				tipoGeneracionId = Constante.TD_TIPO_GEN_SCRSIG;
			}
			
			String script = seguridadService.obtenerAplicacionScript(tipoGeneracionId, aplicacionId, aplicacionIdReemplazo);

			Aplicacion aplicacion = seguridadService.obtenerAplicacion(aplicacionId);

			request.setAttribute("tipoGeneracionId", tipoGeneracionId);
			request.setAttribute("aplicacionId", (("true".equals(request.getParameter("inicio")))?aplicacionId:aplicacionIdReemplazo));
			request.setAttribute("aplicacionNombre", aplicacion.getNombreLargo());
			request.setAttribute("tiposGeneracion", administracionService.obtenerDetalles(Constante.TG_TIPOS_GEN_SCRIPT));
        	request.setAttribute("script", script);
		} catch (Exception e) {
			resultado = guardarMensajeError(request, e);
		}
    	return getRelativeURL("aplscr");
    }
	
	@RequestMapping("/aplscrdwl.do")
    public String descargarScript(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ResultadoOperacion resultado = null;
		try {
			Long aplicacionId = getParameterLong(request, "aplicacionId");
			Long aplicacionIdReemplazo = getParameterLong(request, "aplicacionIdReemplazo");
			
			String script = seguridadService.obtenerAplicacionScript(null, aplicacionId, aplicacionIdReemplazo);

			Aplicacion aplicacion = seguridadService.obtenerAplicacion(aplicacionId);

			String nombreArchivo = "SCRIPT_APLICACION_"+aplicacion.getNombreCorto()+".sql";
			
			response.setContentType("application/sql");
			response.setHeader("content-disposition", "attachment;filename="+nombreArchivo);
			response.setHeader("control-cache", "no-cache");
			ServletOutputStream out = response.getOutputStream();
			out.println(script);
			out.close();
		} catch (Exception e) {
			resultado = guardarMensajeError(request, e);
		}
    	return null;
    }
}
